/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2022 CSTX.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "dht11.h"
#include "adc.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "string.h"
#include "oled.h"
#include <stdlib.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
	// #define SDATA "ON\r\n"
  #define LEDLIGHTCLOSE "lightClose\r\n"
  #define LEDLIGHT1 "lightOne\r\n"
  #define LEDLIGHT2 "lightTow\r\n"
  #define LEDLIGHTALL "lightALL\r\n"

  // 发送端开灯
  #define A_LEDLIGHTCLOSE "lightClose\r\n"
  #define A_LEDLIGHT1 "lightOne\r\n"
  #define A_LEDLIGHT2 "lightTow\r\n"
  #define A_LEDLIGHTALL "A_lightALL\r\n"
  

  enum
  {
    value1 = 1000,
    value2 = 2000,
    value3 = 3500
  };	
	
// void checkLastChar(char *str) 
// {
//     if (*(str + 1) == '\0') 
//     {
//         if (*str == 'g') 
//         {
//             printf("小明说的对，字符串最后一个字符是'g'\n");
//         } 
//         else 
//         {
//             printf("小明说的错，字符串最后一个字符不是'g'\n");
//         }
//     } 
//     else 
//     {
//         checkLastChar(str + 1);
//     }
// }

unsigned char cscxReg[3]={0xC1,0x00,0x09};	//���Ͳ�ѯ����
unsigned char csrevReg[12]={0xC1 ,0x00 ,0x09 ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF, 0xFF ,0xFF ,0xFF};
unsigned char key=0;
unsigned char disOLED[24];


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
	int i ;
	uint16_t ADC_Value = 0;
  char *CSTXREVData[2];
  char *ADC_Temp[2];
  int a = 0;///警报开关
  int b = 0;
  // int c = 0;
  // int timer = 0;
  // char tempa = a;
  // char tempb = b;
  /* MCU Configuration--------------------------------------------------------*/
	
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
	MX_ADC1_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
	USART_Interupt_Enable();	//ʹ�ܴ��ڽ����жϺͿ����ж�
	HAL_ADCEx_Calibration_Start(&hadc1);    //ADУ׼
	
	
	
	printf("LORA Board LED OK\r\n");
	
	CS_OLED_Init();
  OLED_Clear();
	// OLED_ShowString(16,0,"LoRa"); OLED_ShowCHinese(48,0,7);OLED_ShowCHinese(64,0,8);OLED_ShowCHinese(80,0,9);

	printf("LORA Board LCD OK\r\n");
  /* USER CODE END 2 */


	OLED_ShowString(100,0,"[A]");
	cstxInitialize(); 	//��ʼ��LED  ��˸��
	
	if(HAL_GPIO_ReadPin(M1_GPIO_Port, M1_Pin) == 1) //M1 �Ǹߵ�ƽ�ſ�ʼ��ȡģ��ļĴ���
	{
		printf("\r\n M1 = 1 ; M0 = 0 Register mode \r\n");
		CS_Reg_Send_Data(cscxReg,3);//����3���ֽ� 	
		HAL_Delay(300);	//�ȴ��ӳ�
		printf("\r\n\r\nLORA REG CODE %d UART2->",regConut);
		for(i=0;i<12;i++)
		{
			printf("%02X",USART2_RX_BUF[i]);
			printf(" ");
		}	
		cstx_reg_Receive_Data(csrevReg,&key);
		printf("\r\n\r\nLORA REG CODE %d REG->",key);
		memset(disOLED,0,24);
		for(i=0;i<12;i++)
		{
			printf("%02X",csrevReg[i]);
			printf(" ");
		}	
		
		OLED_ShowString(0,2,"Addr:");
		for(i=3;i<5;i++) //��ʾ
		{
			sprintf((char *)disOLED,"%02X",csrevReg[i]);
			printf("disOLED=%s,",disOLED);
			OLED_ShowString(i*16-4,2,disOLED);
		}
		
		OLED_ShowString(82,2,"Ch:");
		sprintf((char *)disOLED,"%02X",csrevReg[8]);
		printf("disOLED=%s\r\n",disOLED);
		OLED_ShowString(104,2,disOLED);
	}
	else
	{
		printf("\r\n M1 = 0; M0 = 0 Transparent mode \r\n");
	}

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	HAL_GPIO_WritePin(M1_GPIO_Port, M1_Pin, GPIO_PIN_RESET); //ʹ��ģ������ PA1
	
	OLED_ShowString(0,0,"Read DHT11 .....");
	if(DHT11_READ_DATA() == 1)
	{
			printf("\r\n ***Read DHT11 Succeed*** \r\n");
		  OLED_ShowString(0,0,"Read DHT11 [OK].");
	}
	else 
	{
			printf("\r\n ***Read DHT11 failure*** \r\n");
		  OLED_ShowString(0,0,"Read DHT11 [NO].");
	}
	int mod_flash = 0;
  while (1)
  {
		//*****
    if(USART_RX_STA == REC_OK)    //当发送端确认发送
		{////发送GET_DHT获取传感器数据////发送GET_ADC获得
			HAL_Delay(500);
			USART2_printf("%s\r\n",USART_RX_BUF); 
			memset(USART_RX_BUF,0,USART_REC_LEN);
			USART_RX_STA = 0;
		}



    /////////////////////////光照传感器部分///////////////////
    if (strstr((char*)USART2_RX_BUF,"GET_ADC"))
    {
      // printf("Fa Song le ADC DATA");
      printf("///Get Control Data///\r\n");
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      HAL_ADC_Start(&hadc1);
      HAL_ADC_PollForConversion(&hadc1, 50);
      ///
      if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
      {
        ADC_Value = HAL_ADC_GetValue(&hadc1);
        printf("\r\n***PA4 ADC=%d , Voltage=%.4fV ***\r\n",ADC_Value ,ADC_Value*3.3f/4096);
        USART2_printf("%d,a",ADC_Value);/////发送AD值   发送了"AD值，0"
        memset(disOLED,0,24);
        ///////////////////接收命令端打印数据用
        sprintf((char *)disOLED,"ADC:%0.2FV ,%d",ADC_Value*3.3f/4096,ADC_Value);
        OLED_ShowString(0,4,"                ");
        OLED_ShowString(0,4,"This the ADC");
        OLED_ShowString(0,6,"                ");
        OLED_ShowString(0,6,disOLED);
        HAL_Delay(300);
      }
      HAL_ADC_Stop(&hadc1);
    }
    else if (strstr((char*)USART2_RX_BUF,"GET_DHT"))
    { 
      ///////////////////温湿度传感器部分////////////////////
      // printf("fa song le DHT11 DATA");
      if(DHT11_READ_DATA() == 1)
      {
        memset(USART2_RX_BUF,0,USART_REC_LEN);
        printf("\r\n Read DHT11 Succeed \r\n");
        USART2_printf("%d.%d%,%d.%d,b",Dht11data[0],Dht11data[1],Dht11data[2],Dht11data[3]);
        memset(disOLED,0,24);
        sprintf((char *)disOLED,"T:%d.%dC H:%d.%dR ",Dht11data[2],Dht11data[3],Dht11data[0],Dht11data[1]);//2和3是温度，0和1是湿度
        printf("\r\n***Send DHT11: %s ***\r\n", disOLED);
        OLED_ShowString(0,2,"                ");
        OLED_ShowString(0,4,"                ");
        OLED_ShowString(0,6,"                ");
        OLED_ShowString(0,4,"This the DHT11");
        OLED_ShowString(0,6,disOLED);
        HAL_Delay(200);
      } 
    }
    else
    {
      if(USART2_RX_STA == REC_OK)
      {
        char *ptr = (char *)USART2_RX_BUF;
        // printf("%s\n", ptr);

        // 使用指针算术运算获取字符串长度
        int length = (int)(strchr(ptr, '\0') - ptr);

        // 指针移动到最后一个字符的位置
        char *lastCharPtr = ptr + length - 1;

        // lastCharPtr指向了最后一个字符
        char lastChar = *lastCharPtr;

        //判断缓冲区2最后一个字符串是不是a；
        // int len = strlen((char*)USART2_RX_BUF);
        if (lastChar == 'a') // 判断最后一个字符是否是'a'
        {  
          //判读为真的话，就将走ADC
          printf("==============GET ADC DATA===========\r\n");
          ADC_Temp[0] = strtok((char*)USART2_RX_BUF,",");
          if(ADC_Temp[0] != NULL)
          {
            printf("\r\nReceived LORA ADC:%d",ADC_Temp[0]);
            sprintf((char *)disOLED,"ADC:%.2fV,%s",(float)atoi(ADC_Temp[0])*3.3f/4096,ADC_Temp[0]);
            printf((const char *)disOLED);
            OLED_ShowString(0,2,"                ");
            OLED_ShowString(0,4,"                ");
            OLED_ShowString(0,6,"                ");
            OLED_ShowString(0,6,(unsigned char *)disOLED);
            if (atoi(ADC_Temp[0]) < value1)
            {
              USART2_printf(LEDLIGHTCLOSE);
            }
            if(atoi(ADC_Temp[0])>value1&&atoi(ADC_Temp[0])<value2)
            {
              USART2_printf(LEDLIGHT1);
            }
            if(atoi(ADC_Temp[0])>value2&&atoi(ADC_Temp[0])<value3)
            {
              USART2_printf(LEDLIGHT2);
            }
            if (atoi(ADC_Temp[0]) > value3)
            {
              USART2_printf(LEDLIGHTALL);
            }
          }
//          else
//          {
//             OLED_ShowString(0,2,"                ");
//             OLED_ShowString(0,4,"                ");
//             OLED_ShowString(0,6,"                ");
//             OLED_ShowString(0,4,"NO DATA RECEIVED");
//           }
        }
        if (lastChar == 'b')
        {
          printf("==============GET DHT DATA===========\r\n");
            CSTXREVData[0] = strtok((char*)USART2_RX_BUF,",");
            CSTXREVData[1] = strtok(NULL,",");
          if(atoi(CSTXREVData[0]) != NULL && atoi(CSTXREVData[1]) != NULL)
          {
            if(atoi(CSTXREVData[0]) >= 50)   
            {
                        //设置湿度阈值为50
              a = 1;    //LED1的开关  开
            }
            if(atoi(CSTXREVData[0]) < 50) 
            {
              a = 2;    //LED1的开关 关
            }
            //===================(温度)LED2判断=========================
            if(atoi(CSTXREVData[1]) >= 25) 
            {
                        //设置温度度度阈值为15
              b = 1;    
            }
            if(atoi(CSTXREVData[1]) < 25)
            {
              b = 2;
            }


            printf("\r\n Received LORA humidity:%s%%RH , temperature:%sC\r\n",CSTXREVData[0],CSTXREVData[1]);
            OLED_ShowString(0,2,"                ");
            OLED_ShowString(0,4,"                ");
            OLED_ShowString(0,6,"                ");
            OLED_ShowCHinese(0,4,1); //湿
            OLED_ShowCHinese(18,4,2); //度
            OLED_ShowString(36,4,":"); 
            OLED_ShowString(54,4,(unsigned char *)CSTXREVData[0]); 
            OLED_ShowString(86,4,"  ");

            OLED_ShowCHinese(0,2,0); //温
            OLED_ShowCHinese(18,2,2); //度
            OLED_ShowString(36,2,":"); 
            OLED_ShowString(54,2,(unsigned char *)CSTXREVData[1]);
            OLED_ShowString(86,2,"  ");
            memset(USART2_RX_BUF,0,USART_REC_LEN);
          }
           else
           {
             OLED_ShowString(0,2,"                ");
             OLED_ShowString(0,4,"                ");
             OLED_ShowString(0,6,"                ");
             OLED_ShowString(0,4,"NO DATA RECEIVED");
           }
        } 
      }
    }
    




    if(a == 1)
    {
      // printf("************Humidity warning**********\r\n");
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
      HAL_Delay(200);
    }
    if(a == 2)
    {
      // printf("************Humidity warning close**********\r\n");
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      a = 0;
    }

    if(b == 1)
    {
      // printf("************Temperature warning**********\r\n");
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_RESET);
      HAL_Delay(200);
    }
    if(b == 2)
    {
      // printf("************Temperature warning close**********\r\n");
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
      b = 0;
    }
    if(strstr((char*)USART2_RX_BUF,"CloseWarn"))
    {
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      USART2_printf("CLOSE");
    }
    if(strstr((char*)USART2_RX_BUF,"CLOSE"))
    {
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
      a = 0;
      b = 0;
    }

    // if(c == 1)
    // {
    //   printf("************ALL warning on**********\r\n");
    //   HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
    //   HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
    //   HAL_Delay(200);
    //   HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
    //   HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_RESET);
    //   HAL_Delay(200);
    // }
    ////////////////////////////////////ADC警告灯光同时也是静态灯光/////////////////////////////////////////////
    if(strstr((char*)USART2_RX_BUF,"lightOne"))
    {
      printf("oneooooo\r\n");
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);

    }

    if(strstr((char*)USART2_RX_BUF,"lightTow"))
    {
      printf("towwwwwwwww\r\n");
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_RESET);

    }

    if(strstr((char*)USART2_RX_BUF,"lightALL"))
    {
      printf("alllllllllll\r\n");
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
      HAL_Delay(200);
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_RESET);
    }
    //lightClose
    if(strstr((char*)USART2_RX_BUF,"lightClose"))
    {
      printf("closeeeeeeee\r\n");
      memset(USART2_RX_BUF,0,USART_REC_LEN);
			mod_flash = 0;
      HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
    }
        /////////////////////////闪光灯光部分////////////////////////

    if (strstr((char*)USART2_RX_BUF,"LED1_flash"))
    {
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      mod_flash = 1;
    }
    if (strstr((char*)USART2_RX_BUF,"LED2_flash"))
    {
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      mod_flash = 2;
    }
    if (strstr((char*)USART2_RX_BUF,"LEDALL_flash"))
    {
      memset(USART2_RX_BUF,0,USART_REC_LEN);
      mod_flash = 3;
    }
		
//		HAL_Delay(200);
//    if (strstr((char*)USART2_RX_BUF,"LEDCLOSE_flash"))
//    {
//      memset(USART2_RX_BUF,0,USART_REC_LEN);
//			mod_flash = 4;
//			printf("mod:%d\r\n",mod_flash);
//			
//    }

    if (mod_flash == 1)
    {
//			printf("on.1_shine\n\r");
//			printf("mod1:%d,mod1:%d,modall:%d\r\n",mod_flash1,mod_flash2,mod_flashALL);
				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
				HAL_Delay(200);
				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
				HAL_Delay(200);
			  if (strstr((char*)USART2_RX_BUF,"LEDCLOSE_flash"))
				{
					memset(USART2_RX_BUF,0,USART_REC_LEN);
					HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
					HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
					mod_flash = 0;
					printf("mod:%d\r\n",mod_flash);	
				}


//			HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);

    }
    if (mod_flash == 2)
    {
//			printf("on.2_shine\n\r");
//			printf("mod:%d,mod1:%d,modall:%d\r\n",mod_flash1,mod_flash2,mod_flashALL);
				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
				HAL_Delay(200);
				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_RESET);
				HAL_Delay(200);
				if (strstr((char*)USART2_RX_BUF,"LEDCLOSE_flash"))
				{
					memset(USART2_RX_BUF,0,USART_REC_LEN);
					HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
					HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
					mod_flash = 0;
					printf("mod:%d\r\n",mod_flash);	
				}

    }
    if (mod_flash == 3)
    {
//			printf("ALL_shine\n\r");
//			printf("mod:%d,mod1:%d,modall:%d\r\n",mod_flash1,mod_flash2,mod_flashALL);
				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
				HAL_Delay(200);
				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_RESET);
				HAL_Delay(200);
				if (strstr((char*)USART2_RX_BUF,"LEDCLOSE_flash"))
				{
					memset(USART2_RX_BUF,0,USART_REC_LEN);
					HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
					HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
					mod_flash = 0;
					printf("mod:%d\r\n",mod_flash);	
				}


    }

  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 8;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT CSTX *****END OF FILE****/
